package com.spzx.product.service.impl;

import com.spzx.common.core.exception.ServiceException;
import com.spzx.common.core.utils.StringUtils;
import com.spzx.common.security.utils.SecurityUtils;
import com.spzx.product.api.domain.Brand;
import com.spzx.product.mapper.BrandMapper;
import com.spzx.product.service.BrandService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BrandServiceImpl implements BrandService {
    @Resource
    private BrandMapper brandMapper;

    @Override
    public List<Brand> selectBrandList(Brand brand) {


        return brandMapper.selectBrandList(brand);
    }

    @Override
    public int deleteBrands(List<Long> ids) {
        return brandMapper.deleteBrands(ids);
    }

    @Override
    public boolean save(Brand brand) {
        //1、校验数据的唯一性
        /*String name = brand.getName();*/
        checkBrandUnique(brand); //不唯一或者为空 ，抛出异常
        //2、新增数据
        //需要后台初始化的属性值
        //SecurityUtils.getUsername() 获取当前登录管理员姓名
        brand.setCreateBy(SecurityUtils.getUsername());
        brand.setDelFlag("0");
        return brandMapper.save(brand);
    }

    @Override
    public Brand getById(Long id) {
        return brandMapper.getById(id);
    }

    @Override
    public boolean edit(Brand brand) {
        //1、校验品牌名称的唯一性
        checkBrandUnique(brand);

        //2、更新数据
        brand.setUpdateBy(SecurityUtils.getUsername());
        return brandMapper.updateById(brand);
    }

    @Override
    public List<Brand> listAll() {
        return brandMapper.listAll();
    }

    //校验品牌名称是否唯一
    private boolean checkBrandUnique(Brand brand) {
        //1、id为空时设置默认值为-1(数据库表中一定不存在)
        Long brandId = brand.getId() == null ? -1L : brand.getId();
        //2、使用品牌名称查询品牌信息
        if (brandId.longValue() == -1l && StringUtils.isEmpty(brand.getName())) {
            throw new ServiceException("新增品牌名称不能为空");
        }
        //新增时  如果查询到品牌对象 表示名称已被占用
        //更新时  如果查询到的对象id和当前id不一样 表示名称已被占用
        Brand oldBrand = brandMapper.selectByName(brand.getName());

        //如果从数据库查询到的品牌对象  并且查询到的品牌id 不等于当前id  表示名称已被占用
        if (oldBrand != null && oldBrand.getId().longValue() != brandId.longValue()) {
            throw new ServiceException((brandId.longValue() == -1l ? "新增" : "修改") + "品牌" + brand.getName() + "'失败，品牌名称已存在");
        }
        return true;
    }
}
